#ifndef DEBUG_H
#define DEBUG_H

#include "Common.h"

#include <iostream>

using namespace std;


class Debug
{
	public:
		Debug();
		virtual ~Debug();


public:

		// Fuction	: 日志打印 打印一般信息
		// Param	: 变长参数模板
		// return	: void
		template <typename T, typename ... Args>
		static void Log(const T& t, const Args& ... data)
		{
			cout<< BOLDWHITE<< "[Log  ]"<<RESET<< ": ";
			Write(t, data...);
		}

		// Fuction	: 日志打印 打印警告信息
		// Param	: 变长参数模板
		// return	: void
		template <typename T, typename ... Args>
		static void Warn(const T& t, const Args& ... data)
		{
			cout<< BOLDYELLOW<< "[Warn ]"<<RESET<< ": ";
			Write(t, data...);
		}

		// Fuction	: 日志打印 打印错误信息
		// Param	: 变长参数模板
		// return	: void
		template <typename T, typename ... Args>
		static void Error(const T& t, const Args& ... data)
		{
			cout<< BOLDRED<< "[Error]"<<RESET<< ": ";
			Write(t, data...);
		}

		// Fuction	: 日志打印 打印一般信息
		// Param	: 变长参数模板
		// return	: void
		template <typename T, typename ... Args>
		static void State(const T& t, const Args& ... data)
		{
			cout<< BOLDGREEN<< "[State]"<<RESET<< ": ";
			Write(t, data...);
		}

	protected:
	private:

		// Fuction	: 打印最后一个换行
		// Param	: 参数模板
		// return	: void
		template <typename T>
		static void Write(const T& t)
		{
			cout<< t<< endl;
		}

		// Fuction	: 标准输出
		// Param	: 变长参数模板
		// return	: void
		template <typename T, typename ... Args>
		static void Write(const T& t, Args ... args)
		{
			cout<< t;
			Write(args...);
		}
};

#endif // DEBUG_H
